Tổng hợp các lệnh bảo mật Linux thiết yếu ai cũng cần đến
Nếu bạn đang quan tâm đến vấn đề bảo mật trên hệ thống Linux của mình thì chớ nên bỏ qua bài viết tổng hợp tất cả các lệnh bảo mật Linux thiết yếu và vô cùng hữu ích bên dưới đây nhé.
Lệnh sudo
Chạy các lệnh đặc quyền với sudo, thay vì chuyển người dùng thành root, là một hành động cần thiết vì nó giúp đảm bảo rằng bạn chỉ sử dụng đặc quyền root khi cần và hạn chế tác động của các lỗi xảy ra. Quyền truy cập của bạn vào lệnh sudo phụ thuộc vào các thiết lập trong file /etc/sudoers và /etc/group.
$ sudo adduser shark Adding user `shark' ... Adding new group `shark' (1007) ... Adding new user `shark' (1007) with group `shark' ... Creating home directory `/home/shark' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for shark Enter the new value, or press ENTER for the default Full Name []: shark Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y
Ví dụ, nếu bạn chạy sudo và muốn tìm hiểu vai trò của mình là gì, bạn sẽ nhận được xác nhận rằng bạn đang chạy lệnh dưới dạng root.
$ sudo whoami root
Nếu bạn quản lý thiết lập sudo cho nhiều người dùng, bạn cũng sẽ thấy thoải mái với lệnh visudo.
Lệnh visudo
Lệnh visudo cho phép bạn thay đổi file /etc/sudoers bằng cách mở file trong trình soạn thảo văn bản và kiểm tra các thay đổi của bạn đối với cú pháp. Chạy lệnh “sudo visudo” và chắc chắn rằng bạn hiểu rõ về cú pháp. Các đặc quyền có thể được gán bởi một người dùng hoặc theo nhóm. Trên hầu hết các hệ thống Linux, file /etc/sudoers sẽ được cấu hình với các nhóm giống như được hiển thị bên dưới, cho phép các đặc quyền được gán cho các nhóm được thiết lập trong file /etc/group. Trong những trường hợp đó, bạn hoàn toàn không cần phải sử dụng lệnh visudo, mà chỉ cần làm quen với các nhóm có đặc quyền root theo cách này, và thực hiện các cập nhật của bạn cho file /etc/group.
%admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL %wheel ALL=(ALL:ALL) ALL
Lưu ý: Tên nhóm có ký hiệu % đứng trước.
Bạn có thể hiển thị nhóm cung cấp truy cập sudo trong file /etc/group của bạn như sau:
$ egrep "admin|sudo|wheel" /etc/group sudo:x:27:shs,jdoe
Cách dễ nhất để cung cấp cho ai đó đặc quyền sudo là thêm chúng vào nhóm được uỷ quyền trong /etc/group. Tuy nhiên, điều đó có nghĩa là họ có thể chạy bất kỳ lệnh nào dưới dạng root. Nếu bạn muốn một số người dùng có quyền root cho một nhóm lệnh nhất định (ví dụ, thêm và xóa tài khoản), bạn có thể xác định các lệnh bạn muốn họ có thể chạy qua lệnh như sau:
Cmnd_Alias ACCT_CMDS = /usr/sbin/adduser, /usr/sbin/deluser
Sau đó cung cấp cho người dùng hoặc nhóm người dùng khả năng chạy các lệnh này bằng sudo với một lệnh như sau:
nemo ALL=(ALL) ACCT_CMDS %techs ALL=(ALL:ALL) ACCT_CMDS
Dòng đầu tiên cho phép người dùng "Nemo" chạy các lệnh twp (adduser và deluser) với sudo, trong khi lệnh thứ hai gán cùng các đặc quyền cho bất kỳ ai thuộc nhóm "tech" trong file /etc/group.
Lệnh who và w
Lệnh who và w cho bạn biết ai đã đăng nhập vào hệ thống, trong đó w hiển thị thêm thông tin, như nơi họ đăng nhập, khi nào họ đăng nhập và thời gian họ đăng nhập là bao lâu.
$ w 18:03:35 up 9 days, 22:48, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT joe tty2 /dev/tty2 27Apr18 9days 7:34 0.09s /usr/lib/x86_64-linux shs pts/1 192.168.0.15 09:50 7.00s 0.28s 0.00s w
Sử dụng lệnh "sudo update-alternatives – config editor", nếu bạn không thích dùng trình soạn thảo mặc định được gọi khi chạy lệnh visudo. Nó sẽ cung cấp một số trình chỉnh sửa tùy chọn và thay đổi cài đặt của bạn.
Lệnh last
Lệnh last hiển thị cho bạn thông tin đăng nhập gần đây của người dùng và thường hữu ích khi bạn đang cố gắng theo dõi các thay đổi hoặc hoạt động khác.
$ last nemo nemo pts/1 192.168.0.15 Wed May 2 07:01 - 08:29 (01:27) wtmp begins Tue May 1 10:21:35 2018
“Nemo” đã không đăng nhập trong một thời gian. Anh ấy có thể đi nghỉ mát (hoặc có thể đi câu cá?) hay vừa mới rời công ty. Loại thông tin này có thể hữu ích trong việc quyết định xem, bạn có cần theo dõi điều này hay không.
Lệnh find
Lệnh find được sử dụng cho nhiều loại tìm kiếm. Khi nói đến bảo mật, bạn có thể thấy mình đang tìm kiếm các file không có chủ sở hữu (không có tài khoản tương ứng) hoặc các file mà bất cứ ai cũng có thể ghi và thực thi được. Lệnh find rất dễ thực hiện, nhưng yêu cầu một số tính năng quen thuộc và nhiều tùy chọn để xác định những gì bạn đang tìm kiếm. Lệnh đầu tiên trong hai lệnh này sẽ tìm các file không có chủ sở hữu xác định. Lệnh thứ hai sẽ tìm thấy các file mà bất kỳ ai cũng có thể chạy và sửa đổi.
$ sudo find /home -nouser $ sudo find / -perm -o=wx
Hãy nhớ rằng -o trong lệnh thứ hai chỉ nhóm "other" - không phải là chủ sở hữu và không phải là nhóm được liên kết với các file.
Lệnh file
Lệnh file xem xét một file và xác định loại file dựa trên nội dung của file đó, chứ không phải tên file. File “.jpg” trong ví dụ bên dưới rõ ràng không phải là file .jpeg thực, mà là file thực thi.
jdoe@stinkbug:~$ ls -l total 24 -rw-r--r-- 1 root root 0 Apr 13 09:59 empty -rwxr-xr-x 1 jdoe jdoe 18840 May 10 17:39 myphoto.jpg -rwx------ 1 jdoe jdoe 24 May 2 07:06 trythis jdoe@stinkbug:~$ file myphoto.jpg myphoto.jpg: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=5d19f7a492405ea9b022a9aa8151f6fb4143633d, stripped
Lệnh which
Lệnh which xác định file thực thi sẽ chạy khi bạn gõ tên của nó. Điều này không phải lúc nào cũng giống như bạn nghĩ. Nếu một Trojan đã được chèn vào hệ thống file ở một vị trí hiển thị trong đường dẫn tìm kiếm của bạn, nó sẽ được chạy thay thế. Đây là lý do chính đáng để đảm bảo rằng đường dẫn tìm kiếm của bạn bao gồm các thư mục như /usr/bin, trước khi nó thêm các vị trí kém chuẩn hơn và đặc biệt là trước "." (thư mục hiện hành).
$ which date /usr/local/bin/date <=== probably not what we wanted
Bạn có thể kiểm tra đường dẫn tìm kiếm của người dùng bằng cách chuyển sang vai trò người dùng và làm như sau:
shs@stinkbug:~$ sudo su - nemo nemo@stinkbug:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin
Ngay cả khi đường dẫn tìm kiếm của người dùng được thiết lập trong file hệ thống như /etc/profile hoặc /etc/bash.bashrc, chúng có thể đã bị thay đổi bởi các cài đặt cục bộ.
$ which date /usr/local/bin/date <=== probably not what we wanted
Lệnh ss
Lệnh ss là một công cụ để điều tra các socket và cho phép bạn làm những việc như hiển thị các cổng nghe và các kết nối hoạt động. Nếu không thêm một số điều kiện, ss sẽ hiển thị nhiều thông tin hơn những gì bạn có thể muốn xem xét. Sau tất cả, nhiều phần của hệ điều hành giao tiếp thông qua các socket. Nếu bạn muốn tạo danh sách các kết nối đã được thiết lập hoặc các cổng nghe (nghĩa là các dịch vụ có sẵn cho các hệ thống bên ngoài), các lệnh như thế này sẽ rất hữu ích.
Cho các kết nối được thiết lập:
$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 224 192.168.0.20:ssh 192.168.0.15:56647 $ ss | grep ESTAB | grep tcp tcp ESTAB 0 64 192.168.0.20:ssh 192.168.0.15:64885
Cho các cổng nghe:
$ ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 5 127.0.0.1:631 *:* LISTEN 0 50 *:445 *:* LISTEN 0 50 *:139 *:* LISTEN 0 128 *:5355 *:* LISTEN 0 128 :::22 :::* LISTEN 0 5 ::1:631 :::* LISTEN 0 50 :::445 :::* LISTEN 0 128 :::5355 :::* LISTEN 0 50 :::139 :::*
Lưu ý: Cổng 631 (CUPS) chỉ nghe trên giao diện loopback (127.0.0.1).
Lệnh ufw
Nếu bạn đang chạy tường lửa trên hệ thống Linux của mình - một bước quan trọng để kiểm soát quyền truy cập vào hệ thống, các lệnh được sử dụng để bắt đầu/kết thúc, bật/tắt, sửa đổi và hiển thị trạng thái hoặc các quy tắc hoạt động là rất quan trọng. Dưới đây là một số lệnh mẫu cho ufw mà bạn sẽ tìm thấy trên nhiều hệ thống Ubuntu:
$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22 ALLOW IN 192.168.0.0/24
Tường lửa này đang hoạt động và chỉ cho phép các kết nối từ mạng cục bộ đến ssh. Các lệnh sau đây sẽ:
1. Thiết lập quy tắc được hiển thị ở trên 2. Vô hiệu hóa tường lửa.
$ sudo ufw allow from 192.168.0.0/24 to any port 22 $ sudo ufw disable
Lệnh iptables
Điều quan trọng là phải biết cách liệt kê các quy tắc tường lửa cho iptables. Các lệnh này sẽ cung cấp cho bạn một danh sách đầy đủ các quy tắc netfilter:
sudo iptables -vL -t filter sudo iptables -vL -t nat sudo iptables -vL -t mangle sudo iptables -vL -t raw sudo iptables -vL -t security
Lệnh ip
Lệnh ip cho phép bạn hiển thị thông tin trên các giao diện mạng của mình. Trong ví dụ bên dưới, chúng ta sẽ thấy loopback (vòng lặp) và giao diện công khai.
$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff inet 192.168.0.20/24 brd 192.168.0.255 scope global dynamic enp0s25 valid_lft 59794sec preferred_lft 59794sec inet6 fe80::f233:4f72:4556:14c2/64 scope link valid_lft forever preferred_lft forever
Lệnh ip route
Lệnh ip route sẽ hiển thị bảng định tuyến của bạn:
$ ip route default via 192.168.0.1 dev enp0s25 proto static metric 100 169.254.0.0/16 dev enp0s25 scope link metric 1000 192.168.0.0/24 dev enp0s25 proto kernel scope link src 192.168.0.20 metric 100
Lệnh kill, pkill và killall
Các hệ thống Unix và Linux cung cấp một lựa chọn thuận tiện cho các lệnh để chấm dứt các tiến trình, bất cứ khi nào bạn muốn. Bạn có thể kết thúc bằng ID của tiến trình hoặc theo tên của nó. Bạn có thể kết thúc từng tiến trình một hoặc theo nhóm. Trong bất kỳ trường hợp nào, các lệnh kết thúc khác nhau đều có sẵn cho bạn sử dụng khi cần thiết. Những ví dụ bao gồm:
$ kill 1234 $ pkill bad $ killall badproc
Lệnh passwd
Lệnh passwd có lẽ là khá rõ ràng khi nói đến bảo mật hệ thống, nhưng nó không nên bị bỏ qua trong bất kỳ danh sách cần thiết về bảo mật nào. Thay đổi mật khẩu, đặc biệt là khi nhiều người dùng đến rồi đi hoặc vai trò của họ thay đổi, là rất quan trọng.
Tuy nhiên, lệnh passwd không chỉ được sử dụng để thay đổi mật khẩu. Bạn cũng có thể sử dụng nó với đặc quyền sudo để thay đổi mật khẩu của người dùng khác, khóa/mở khóa hoặc làm tài khoản hết hạn, kiểm tra trạng thái tài khoản và thay đổi cài đặt để xác định thời điểm mật khẩu hết hạn hoặc cảnh báo mật khẩu thời gian.
Kiểm tra trang man (man passwd) để biết chi tiết và sử dụng các lệnh như sau:
$ sudo passwd nemo <== change nemo's password $ sudo passwd -e dory <== expire dory's password (forces her to reset it) $ sudo passwd -i shark <== disable shark's account
Lệnh pwck
Lệnh pwck thực hiện kiểm tra trên các file /etc/passwd và /etc/shadow của bạn, đảm bảo các trường bắt buộc có mặt, các file và thư mục tồn tại, v.v...
$ sudo pwck user 'squash': directory '/home/squash' does not exist user 'squash': program '/bin/bsh' does not exist
Lệnh setfacl và getfacl
Đừng để rwxr-x --- đánh lừa bạn rằng đây là tất cả những gì cần có để cấp quyền cho các file trên các hệ thống Linux. Với lệnh setfacl và getfacl, bạn có thể cấp quyền cho ai đó không phải là chủ sở hữu của file và không phải là thành viên của nhóm được liên kết (và bạn cũng không muốn họ trở thành thành viên của nhóm này) truy cập vào file. Giả sử bạn muốn “Nemo” có quyền đọc đối với một file phác thảo hướng dẫn thiết lập ufw của bạn và chỉ vậy thôi. Sử dụng lệnh như sau để sửa đổi danh sách điều khiển truy cập (ACL) cho file:
$ setfacl -m u:nemo:r ufw-setup
Lệnh getfacl sau đó sẽ hiển thị rằng thay đổi đã được thực hiện:
$ getfacl ufw-setup # file: ufw-setup # owner: shs # group: shs user::rwx user:nemo:r-- <=== group::rw- #effective:r-- mask::r-- other::---
Lệnh sestatus & apparmor
Lệnh sestatus và apparmor có thể hiển thị trạng thái của các công cụ SELinux và apparmor, cung cấp sự cách ly giữa các ứng dụng sử dụng điều khiển truy cập bắt buộc. Nếu bạn đang sử dụng một hoặc các công cụ khác, bạn nên biết cách hiển thị trạng thái của chúng.
sestatus
$ sudo sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 28
apparmor
$ sudo apparmor_status apparmor module is loaded. 18 profiles are loaded. 18 profiles are in enforce mode. /sbin/dhclient /usr/bin/evince /usr/bin/evince-previewer /usr/bin/evince-previewer//sanitized_helper /usr/bin/evince-thumbnailer /usr/bin/evince-thumbnailer//sanitized_helper /usr/bin/evince//sanitized_helper /usr/lib/NetworkManager/nm-dhcp-client.action /usr/lib/NetworkManager/nm-dhcp-helper /usr/lib/connman/scripts/dhclient-script /usr/lib/cups/backend/cups-pdf /usr/lib/snapd/snap-confine /usr/lib/snapd/snap-confine//mount-namespace-capture-helper /usr/sbin/cups-browsed /usr/sbin/cupsd /usr/sbin/cupsd//third_party /usr/sbin/ippusbxd /usr/sbin/tcpdump 0 profiles are in complain mode. 3 processes have profiles defined. 3 processes are in enforce mode. /sbin/dhclient (705) /usr/sbin/cups-browsed (30173) /usr/sbin/cupsd (26828) 0 processes are in complain mode. 0 processes are unconfined but have a profile defined.
Bạn cũng nên biết cách bắt đầu và dừng các công cụ này.
$ sudo /etc/init.d/apparmor start $ sudo /etc/init.d/apparmor stop $ sudo /etc/init.d/apparmor restart
Đối với SELinux, các chế độ khác nhau đại diện cho:
enforcing -- SELinux security policy is enforced permissive -- SELinux prints warnings instead of enforcing disabled -- SELinux is fully disabled
Trên đây là tổng hợp các lệnh bảo mật Linux thiết yếu ai có thể giúp bạn quản lý bảo mật tốt hơn. Nếu có bất cứ thắc mắc gì thì hãy comment bên dưới để được chúng tôi hỗ trợ nhé.
Nguồn bài: Quantrimang